/*
 * Copyright(C) 2010 Luvina Software Company
 *
 * GenericDaoImpl.java, Oct 29, 2010 ntmhuong
 */
package net.luvina.manageuser.dao.impl;

import java.io.Serializable;

import net.luvina.manageuser.dao.GenericDao;

import org.hibernate.LockMode;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.stereotype.Repository;

/**
 * 各Daoの親クラス用の汎用Dao
 *
 * @version $Rev$
 * @param <T>
 *            テーブル用DTOのクラス
 * @param <PK>
 *            PrimaryKeyのクラス
 */

public class GenericDaoImpl<T, PK extends Serializable> implements GenericDao<T, PK> {
	private Class<T> type;
	private HibernateTemplate hibernateTemplate;

	/**
	 * テーブルの型指定
	 *
	 * @param type
	 *            テーブル用DTOのクラス
	 */
	public GenericDaoImpl(Class<T> type) {
		this.type = type;
	}

	/**
	 * HibernateTemplate用のSessionFactoryを設定
	 *
	 * @param sessionFactory
	 */
	@Autowired
	public void setSessionFactory(SessionFactory sessionFactory) {
		this.hibernateTemplate = new HibernateTemplate(sessionFactory);
	}

	/**
	 * HibernateTemplate用のSessionFactoryを取得
	 */
	public HibernateTemplate getHibernateTemplate() {
		return this.hibernateTemplate;
	}

	/**
	 * HibernateTemplate.saveのラッパ
	 *
	 * @param o
	 *            追加するデータ
	 */
	@SuppressWarnings("unchecked")
	public PK create(T o) {
		return (PK) this.hibernateTemplate.save(o);
	}

	/**
	 * HibernateTemplate.getのラッパ
	 *
	 * @param id
	 *            PrimaryKey
	 */
	public T read(PK id) {
		return (T) this.hibernateTemplate.get(this.type, id);
	}

	/**
	 * HibernateTemplate.getのラッパ
	 *
	 * @param id
	 *            PrimaryKey
	 */
	public T read(PK id, LockMode lockMode) {
		return (T) hibernateTemplate.get(this.type, id, lockMode);
	}

	/**
	 * HibernateTemplate.updateのラッパ
	 *
	 * @param o
	 *            更新するデータ
	 */
	public void update(T o) {
		this.hibernateTemplate.update(o);
	}

	/**
	 * HibernateTemplate.deleteのラッパ
	 *
	 * @param o
	 *            削除するデータ
	 */
	public void delete(T o) {
		this.hibernateTemplate.delete(o);
	}
}